Exámen 2

Este exámen se enfoca en dos temas, gráficos y ajustes, los puntos a desarrollar son los siguientes. En una carpeta con su nombre encontrará:

  1. 6 gráficos en orden de dificultad, su tarea es escribir el código requerido para generar dicho gráfico, incluyendo títulos en los ejes, leyenda y grilla, la función a la que obedecen los datos con los que se genera el gráfico se puede encontrar en la leyenda.

  2. 3 conjuntos de datos también en orden de dificultad (data00.txt el más fácil) debe cargar estos datos usando la función x, y = np.loadtxt('data##.txt', unpack=True) para despues ajustarlos usando una de las técnicas vistas en clase. Si abre el archivo .txt encontrará en el encabezado una pista sobre la función de la que provienen los datos. Para este punto debe:

    • Proporcionar los parámetros de ajuste correctos para cada uno de los conjuntos de datos.
    • Realizar un gráfico con los datos originales (puntos) y el ajuste de la función, tal como hemos hecho en repetidas ocaciones.

Cada uno de los 2 puntos tendrá el mismo valor sobre la nota final.

A continuación se presenta el código usado para generar los parciales (sin embargo, se oculta la semilla utilizada).


In [1]:
%matplotlib inline
from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt
import numpy as np
import os
import json

In [2]:
np.random.seed(123)

GUYS = [
    'Juan Diego Carmona Benavides',
    'Andrea Carolina Forero Pineda',
    'Ivan Dario Gomez Cuatindioy',
    'Jorge Alberto Latorre Arroyave',
    'Alejandro Martinez Castaño',
    'Andres Martinez Delgado',
    'Daniel Felipe Martinez Vizcaino',
    'Gustavo Andres Molina Ortiz',
    'Juan Sebastian Pelaez Garzon',
    'Walter Mauricio Ramirez Aristizabal',
    'Sergio Ramirez Velasco',
    'Stephania Riaño Casabianca',

]

In [3]:
PARTIAL_DIR = 'exam1_2017_1'
SOLUTIONS_DIR = 'exam1_2017_1_solutions'

In [4]:
def create_missing_dirs(*dirs):
    for folder in dirs:
        if not os.path.exists(folder):
            os.makedirs(folder)
create_missing_dirs(PARTIAL_DIR, SOLUTIONS_DIR)

In [5]:
def random_params(number, min_val=1, max_val=5):
    return tuple(
        np.round(
            np.random.uniform(min_val, max_val, size=number),
            decimals=1
        )
    )

In [6]:
def random_style():
    style = np.random.choice(['-', '-.', '--'], p=[.50, .30, .20])
    color = np.random.choice(['blue', 'green', 'red'])
    return style, color

In [7]:
def plot(x, y, label, plot_command=None):
    if plot_command is None:
        plot_command=plt.plot
    style, color = random_style()
    plot_command(x, y, style, label=label, color=color)
    plt.xlabel(r'$x$')
    plt.ylabel(r'$y$')
    plt.grid()
    plt.legend(loc='best')

In [8]:
def cos_plot():
    a, omega, phi = random_params(3)
    x = np.linspace(-10, 10, 200)
    y =  a * np.cos(omega * x + phi)
    plot(x, y,
         r'$y = {:.1f} \, \cos({:.1f} x + {:.1f})$'.format(a, omega, phi))

def line_plot():
    a, b = random_params(2)
    x = np.linspace(-10, 10)
    y = a * x + b
    plot(x, y, label=r'$y = {:.1f} x + {:.1f}$'.format(a, b))

def parable_plot():
    a, b, c = random_params(3)
    x = np.linspace(-10, 10)
    y = a * x ** 2 + b * x + c
    plot(x, y,
         label=r'$y = {:.1f} x ^ 2 + {:.1f} x + {:.1f}$'.format(a, b, c))

def sqrt_plot():
    a, = random_params(1)
    x = np.linspace(0, 10)
    y = a * np.sqrt(x)
    plot(x, y, label=r'$y = {:.1f} \sqrt{{x}}$'.format(a))

def exponential_plot():
    a, n, = random_params(2, min_val=0.5, max_val=2)
    x = np.linspace(0, 10)
    y = a * x ** n
    plot(x, y, label=r'$y = {:.1f} x ^ {{{:.1f}}}$'.format(a, n))
    
def exponential_loglog_plot():
    a, n, = random_params(2)
    x = np.linspace(0, 10)
    y = a * x ** n
    plot(x, y,
         label=r'$y = {:.1f} x ^ {{{:.1f}}}$'.format(a, n),
         plot_command=plt.loglog)

EASY_PLOTS = [
    cos_plot,
    line_plot,
    parable_plot,
    sqrt_plot,
    exponential_plot,
    exponential_loglog_plot,
]

In [9]:
def hard_plot():
    components = np.random.choice(EASY_PLOTS, 2, replace=False)
    for i, p in enumerate(components):
        plt.subplot(1, 2, i + 1)
        p()
        plt.tight_layout()

HARD_PLOTS = [
    hard_plot
    for _ in range(10)
]

In [10]:
def harder_plot():
    p1, p2, p3 = np.random.choice(EASY_PLOTS, 3, replace=False)
    plt.subplot(2, 1, 1)
    p1()
    plt.subplot(2, 2, 3)
    p2()
    plt.subplot(2, 2, 4)
    p3()
    plt.tight_layout()

HARDER_PLOTS = [
    harder_plot
    for _ in range(10)
]

In [11]:
def get_x():
    return np.linspace(0, 20, 1000)

In [15]:
def line_data():
    a, b = random_params(2)
    x = get_x()
    y = a * x + b
    return x, y, '$y = m x + b$', ('line', a, b)

def parable_data():
    a, b, c = random_params(3)
    x = get_x()
    y = a * x ** 2 + b * x + c
    return x, y, r'$y = a x^2 + bx + c$', ('parable', a, b, c)

def sqrt_data():
    a, = random_params(1)
    x = get_x()
    y = a * np.sqrt(x)
    return x, y, r'$y = c * \sqrt{x}$', ('sqrt', a)

def exponential_data():
    a, n, = random_params(2, min_val=0.5, max_val=2)
    x = get_x()
    y = a * x ** n
    return x, y, r'$y = A x ^ n$', ('exponential', a, n)

def logarithmic_data():
    a, b, = random_params(2, min_val=0.5, max_val=2)
    x = get_x()
    y = a * np.log(x + b)
    return x, y, r'$y = a \log(x + b)$', ('logarithm', a, b)

SUPER_EASY_DATA = [
    line_data,
    parable_data,
    sqrt_data,
    exponential_data,
    logarithmic_data,
]

In [16]:
def easy_data():
    d1, d2 = np.random.choice(SUPER_EASY_DATA, 2, replace=False)
    x1, y1, label1, params1 = d1()
    x2, y2, label2, params2 = d2()
    return (
        x1,
        y1 + y2,
        '\n'.join([label1, label2]),
        (params1, params2)
    )

EASY_DATA = [
    easy_data
    for _ in range(20)
]

In [17]:
for guy in GUYS:
    guy_dir = os.path.join(PARTIAL_DIR, guy)
    create_missing_dirs(guy_dir)

    all_plots = (
        list(np.random.choice(EASY_PLOTS, size=2, replace=False)) +
        list(np.random.choice(HARD_PLOTS, size=2, replace=False)) +
        list(np.random.choice(HARDER_PLOTS, size=2, replace=False))
    )

    pp = PdfPages(os.path.join(guy_dir, 'gráficos.pdf'))
    for p in all_plots:
        plt.figure()
        p()
        plt.tight_layout()
        pp.savefig()
        plt.close()
    pp.close()

    solutions = []
    all_data = (
        [np.random.choice(SUPER_EASY_DATA)] +
        [np.random.choice(SUPER_EASY_DATA)] +
        [np.random.choice(EASY_DATA)]
    )
    for i, d in enumerate(all_data):
        x, y, label, conditions = d()
        np.savetxt(
            os.path.join(guy_dir, 'data{:02}.txt'.format(i)),
            np.array([x, y]).T,
            header=label,
        )
        solutions.append(conditions)

    guy_solutions = os.path.join(SOLUTIONS_DIR, '{}.json'.format(guy))
    with open(guy_solutions, 'w') as sol:
        json.dump(solutions, sol, indent=4)
    
    print('done with', guy)


done with Juan Diego Carmona Benavides
done with Andrea Carolina Forero Pineda
done with Ivan Dario Gomez Cuatindioy
done with Jorge Alberto Latorre Arroyave
done with Alejandro Martinez Castaño
done with Andres Martinez Delgado
done with Daniel Felipe Martinez Vizcaino
done with Gustavo Andres Molina Ortiz
done with Juan Sebastian Pelaez Garzon
done with Walter Mauricio Ramirez Aristizabal
done with Sergio Ramirez Velasco
done with Stephania Riaño Casabianca

In [ ]: